home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bixdos.arc / NUMFILES < prev    next >
Text File  |  1986-11-24  |  3KB  |  72 lines

  1.  
  2.        How to overcome the limit on open files imposed by MS/PC-DOS
  3.  
  4. The following procedure has been tested and found working under DOS 3.1.
  5. It may not work under DOS 2.1 (I tested it once and it failed) but the
  6. patch won't have any effect on program operation under 2.1.
  7.  
  8. NOTE - this is not a patch to DOS; it is a patch applied to the user
  9. program and must be incorporated at assembly/compile time.
  10.  
  11.  
  12. Regardless of the FILES= variable in CONFIG.SYS, DOS imposes an arbitrary
  13. limit of 20 simultaneously open files per process.  That number includes
  14. the five pre-opened standard files, STDIN, STDOUT, STDERR, STDAUX and STDPRN.
  15. Under normal circumstances, the resulting limit of 15 simultaneously open
  16. user files is quite sufficient.  If you application, however, requires access
  17. to more than 15 files, and if you don't feel like closing and reopening files
  18. to remain within the 15-file limit, you might want to consider adding the
  19. follwing patch to your program source.
  20.  
  21. DESCRIPTION of the patch -- you code it:
  22.  
  23. PSP+18H contains a table of 20 file handles.  When a program is invoked,
  24.         normally only the first 5 handles are open, all others are 0FFH.
  25.  
  26. PSP+32H contains a word value that signifies the maximum number of open
  27.         files for the process.  This number is 14H (20) by default.
  28.  
  29. PSP+34H contains the offset to the file handle table (18H default).
  30.  
  31. PSP+36H contains the segment address of the file handle table (default is
  32.         same as the PSP's data segment).
  33.  
  34.  
  35. To extend the number of simultaneously open files, your program must do the
  36. following in sequence and before opening any files:
  37.  
  38. 1. Provide a data block containing a 0FFH byte for each file you wish to
  39.    be able to open simultaneously.
  40.  
  41. 2. Copy the first 20 bytes of the table at PSP+18H into the beginning of
  42.    the new data block.
  43.  
  44. 3. change the segment address at PSP+36H and the offset at PSP+34H to point
  45.    to the new data block.
  46.  
  47. 4. change the count at PSP+32H to the new count, which must not exceed the
  48.    size of the new data block.
  49.  
  50. 5. continue normally with program execution.
  51.  
  52.    Note that no I/O whatsoever must occur between steps 2 and 5!
  53.  
  54. You can test the change by repeatedly opening a file until an error occurs.
  55. The following program fragment assumes that PSP-segment = DS = ES:
  56.  
  57. code segment:
  58.         MOV     SI,18H
  59.         MOV     DI,Offset PFT
  60.         MOV     Word Ptr .34H,DI
  61.         MOV     CX,10
  62.         REP     MOVSW                   ; COPY OLD PROCESS FILE TABLE
  63.         MOV     AX,ES
  64.         MOV     Word Ptr .36H,AX
  65.         MOV     Byte Ptr .32H,MAXFLS
  66. data segment:
  67. PFT     DB      0FFH,0FFH,0FFH,0FFH,0FFH,0FFH......
  68.  
  69.  
  70. Be sure to change the FILES= variable in CONFIG.SYS to a number at least as
  71. large as PSP+32H.
  72.